/*
 * CaminoMinimo.h
 *
 *  Created on: 07/04/2013
 *      Author: Juliansci
 */

#ifndef CAMINOMINIMO_H_
#define CAMINOMINIMO_H_

#include "../Casilla.h"
#include "../Escenario.h"
#include <vector>
#define INF 999999

using namespace std;

class Casilla;
class Escenario;

class NodoCamino {
public:
	NodoCamino(int dist, int costoHeuristica, Casilla* prev, Casilla* cas);
	int getDistancia();
	int getCostoHeuristica();
	Casilla* getCasilla();
	Casilla* getPrevio();
	void setDistancia(int dist);
	void setCostoHeuristica(int costo);
	void setPrevio(Casilla* prev);
	void setCasilla(Casilla* cas);

private:
	int distancia;
	int costoHeuristica;
	Casilla* previo;
	Casilla* casilla;
};

class CaminoMinimo {

private:
	Escenario* escenario;
	vector<vector <NodoCamino*> > nodos;
	NodoCamino* obtenerNodoMinimo(list<NodoCamino*>);
	bool sonVecinos(NodoCamino* nodo1, NodoCamino* nodo2);
	bool esPosicionValida(int x, int y);
	list<NodoCamino*> obtenerVecinosTransitables(NodoCamino*);
	list<NodoCamino*> obtenerVecinos(NodoCamino*);
	bool perteneceA(NodoCamino*,list<NodoCamino*>);
	int calcularHeuristica(NodoCamino* origen, Casilla* final);
	Casilla* reemplazarFinal(NodoCamino* finalOriginal);


public:
	CaminoMinimo(Escenario* escenario);
	list<Casilla*> getCaminoMinimo (Casilla* inicial, Casilla* final);

};



#endif /* CAMINOMINIMO_H_ */
